﻿/* 工具类js. add by terry */

// px,py 中心点.
// mx,my 外部点.
// 获得两个点之间的坐标连线，与y轴正半轴之间的夹角
function getAngle(px,py,mx,my){
    var x = Math.abs(px-mx);
    var y = Math.abs(py-my);
    var z = Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
    var cos = y/z;
    var radina = Math.acos(cos);//用反三角函数求弧度
    var angle = Math.floor(180/(Math.PI/radina));//将弧度转换成角度

    if(mx>px&&my>py){//鼠标在第四象限
        angle = 180 - angle;
    }

    if(mx==px&&my>py){//鼠标在y轴负方向上
        angle = 180;
    }

    if(mx>px&&my==py){//鼠标在x轴正方向上
        angle = 90;
    }

    if(mx<px&&my>py){//鼠标在第三象限
        angle = 180+angle;
    }

    if(mx<px&&my==py){//鼠标在x轴负方向
        angle = 270;
    }

    if(mx<px&&my<py){//鼠标在第二象限
        angle = 360 - angle;
    }

    return angle;
}


// str 字符串.
// strFontSize 字体大小.
// 计算字符串的像素数.
function calcStringPixelsCount(str, strFontSize) {
    // 字符串字符个数
    var stringCharsCount = str.length;

    // 字符串像素个数
    var stringPixelsCount = 0;

    // JS 创建HTML元素：span
    var elementPixelsLengthRuler = document.createElement("span");
    elementPixelsLengthRuler.style.fontSize = strFontSize;  // 设置span的fontsize
    elementPixelsLengthRuler.style.visibility = "hidden";  // 设置span不可见
    elementPixelsLengthRuler.style.display = "inline-block";
    elementPixelsLengthRuler.style.wordBreak = "break-all !important";  // 打断单词

    // 添加span
    document.body.appendChild(elementPixelsLengthRuler);

    for (var i =0; i < stringCharsCount; i++) {
        // 判断字符是否为空格，如果是用&nbsp;替代，原因如下：
        // 1）span计算单个空格字符（ ），其像素长度为0
        // 2）空格字符在字符串的开头或者结果，计算时会忽略字符串
        if (str[i] == " ") {
            elementPixelsLengthRuler.innerHTML = "&nbsp;";
        } else {
            elementPixelsLengthRuler.innerHTML = str[i];
        }

        stringPixelsCount += elementPixelsLengthRuler.offsetWidth;
    }

    return stringPixelsCount;
}

// 根据id获取node对象
function getNodeObj(id){
	// 遍历获取node.
	for(var j = 0; j < defaultConfig.data.nodes.length; j++) {
	   if(defaultConfig.data.nodes[j].id == id){
	   		return defaultConfig.data.nodes[j];
	   }
	}
    return null;
}

// 根据两个id获取line对象
function getLineObj(id,tid){
	// 遍历获取node.
	for(var j = 0; j < defaultConfig.data.nodes.length; j++) {
	   if(defaultConfig.data.links[j].source.id == id && defaultConfig.data.links[j].target.id == tid){
	   		return defaultConfig.data.links[j];
	   }
	   if(defaultConfig.data.links[j].source.id == tid && defaultConfig.data.links[j].target.id == id){
	   		return defaultConfig.data.links[j];
	   }
	}
    return null;
}

// 获取可保存的结构信息.
function getSaveStructData(){
	// 克隆一个新的对象出来.
	var saveData = cloneObj(defaultConfig.data);
	for(var j = 0; j < saveData.links.length; j++) {
		saveData.links[j].source = saveData.links[j].source.id;
		saveData.links[j].target = saveData.links[j].target.id;
	}
	// 返回保存数据.
	return saveData;
}

//深复制对象方法    
var cloneObj = function (obj) {  
    var newObj = {};  
    if (obj instanceof Array) {  
        newObj = [];  
    }  
    for (var key in obj) {  
        var val = obj[key];  
        //newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; //arguments.callee 在哪一个函数中运行，它就代表哪个函数, 一般用在匿名函数中。  
        newObj[key] = typeof val === 'object' ? cloneObj(val): val;  
    }  
    return newObj;  
};